home *** CD-ROM | disk | FTP | other *** search
- #include "STDIO.h"
- #include "STDLIB.h"
- #include "IO.h"
- #include "FCNTL.h"
- #include "DOS.h"
- #include "DIR.h"
-
- /*
- DIRSEL.c v1.00 Vernon E. Davis
- 07/12/87 17 South Centre Street
- Merchantville, NJ 08109
- CompuServe [71330,2705]
- GEnie - VED
-
- Adapted for Power C 2.0.1 by
- Chuck Steenburgh [72330,1776]
-
-
- purpose : to select one filename from the list presented
- syntax : #include "STDIO.h"
- : #include "STDLIB.h"
- : #include "IO.h"
- : #include "FCNTL.h"
- : #include "DOS.h"
- : #include "DIR.h"
- : *p = dirselect(*mask,attr);
- : char *p; the filename
- : char *mask; the directory mask, i.e. "*.*"
- : int attr; the attribute to look for,i.e.
- : FA_RDONLY, FA_HIDDEN, FA_SYSTEM,
- : FA_LABEL, FA_DIREC, FA_ARCH.
- : (see dos.h or Turbo C manual for info.)
- :
- returns : either a pointer to a filename that was selected or
- : NULL if Escape was pressed and if no file is found.
- :
- descrip. : a call to dirselect() first determines if there are any files
- : that meet the specs received from the directory mask. If
- : no files were found, the function immediately returns NULL.
- : Otherwise, all filenames that meet the mask spec are copyed
- : into an array that can hold up to 120 selections. The routine
- : then clears a portion of the screen, saving the contents of
- : the screen in an array. A frame is drawn in the cleared portion
- : of the screen and the current directory contents are displayed
- : in the boxed area as per the mask that was received. The first
- : selection is highlighted in reverse video. The up/down/left/
- : right arrow keys will move the highlight around. The Home Key
- : returns to the first selection. The End key moves to the last
- : selection. When < CR > is pressed, the screen returns to
- : normal, the cursor is placed in its original position and the
- : value returned from the function is a pointer to a string
- : containing the filename selected. If Esc was pressed instead,
- : the previous sequence is performed, with the exception of NULL
- : being returned instead of the filename.
- :
- notes : A. All routines in this file can be run under TC, the
- : Turbo C Integrated Development Environment. Because of
- : this, the routine will run slow when executed. It was
- : not designed for speed.
- : B. These routines rely on the video hardware interrupt 0x10
- : for the cursor information. Insure that the PC is an IBM
- : or compatable.
- : C. Three (3) cursor functions and a frame drawing function are
- : available. They are as follows:
- : 1. void gotoxy(x,y); move cursor to new location
- : int x (0..79)
- : int y (0..24)
- : 2. void cursor(ON/OFF); turn cursor on or off
- : int ON (1) or OFF (0)
- : 3. xyposdef wherecur(void); locate cursor position
- : xyposdef.x (0..79) column location
- : xyposdef.y (0..24) row location
- : 4. void drframe(top,left,bottom,right); draw double fr.
- : int top (0..24) top corner
- : int left (0..79) left corner
- : int bottom (0..24) bottom corner
- : int right (0..79) right corner
- : The other functions declared are special to dirselect()
- : and of no real use; however, they are documented.
- */
-
- #define TRUE 1
- #define FALSE 0
- #define ON 1
- #define OFF 0
- #define VIDINTR 0x10
- #define EQUINTR 0x11
- #define FPOS1 1
- #define FPOS2 14
- #define FPOS3 27
- #define FPOS4 40
- #define FPOS5 53
- #define FPOS6 66
-
- typedef struct /* structure for directory array */
- { char fname[13];
- } dirdef;
-
- typedef struct /* structure for cursor column(x) and row(y) */
- { int x,y;
- } xyposdef;
-
- /* function declarations */
-
- char* dirselect(char*,int); /* the main function */
- void hilite(unsigned char,unsigned char); /* highlights the filename */
- xyposdef fnamepos(unsigned char); /* X/Y position of filename */
- void gotoxy(unsigned char,unsigned char); /* move cursor to new location */
- void cursor(int); /* turn cursor on or off */
- xyposdef wherecur(void); /* current cursor location */
- int menubox(int r1, c1, r2, c2, color, boxtype, shadow, shade); /* See file MENUBOX.C */
-
- char* dirselect(mask,attr)
- char mask[13];
- int attr;
- { union REGS regs;
- struct ffblk ffblk;
- int h,i,j,k,row,error,oldcurx,oldcury;
- unsigned char oldpos,newpos;
- char chrbuf[4000],atrbuf[4000];
- char key;
- dirdef dos_dir[121],*dos_dirptr;
- xyposdef xypos;
- h=0;
- if((error=findfirst(mask,&ffblk,attr))==-1) /* if not found, return NULL */
- return(NULL);
- while(!error&&h!=120) /* else, collect filenames */
- { dos_dirptr=&dos_dir[h++];
- strcpy(dos_dirptr->fname,ffblk.ff_name);
- error=findnext(&ffblk);
- };
- xypos=wherecur(); /* store old cursor position */
- oldcurx=xypos.x;
- oldcury=xypos.y;
- cursor(OFF);
- k=0;
- for(i=0;i<((h/6)+3);i++) /* store old screen info & clear portion */
- { for(j=0;j<80;j++)
- { gotoxy(j,i);
- regs.h.bh=0;
- regs.h.ah=8;
- int86(VIDINTR,®s,®s);
- chrbuf[k]=regs.h.al;
- atrbuf[k]=regs.h.ah;
- putch(32);
- k++;
- };
- };
- gotoxy(0,0);
- i=0; j=0; row=1;
- while(TRUE) /* display all filenames */
- { dos_dirptr=&dos_dir[i];
- xypos=fnamepos(i);
- gotoxy(xypos.x,xypos.y);
- printf("%-012.12s",dos_dirptr->fname);
- i++; j++;
- if(i==h||i==120) break;
- if(j>5)
- { j=0;
- row++;
- printf("\n");
- };
- };
- menubox(0,0,(row+1),79,15,3,0,1); /* draw the frame */
- hilite(255,0); /* highlight the first filename */
- oldpos=0;
- newpos=0;
- while(TRUE) /* get keypress and do appropriate action */
- { key=getch();
- switch(key)
- { case 27: /* Esc */
- k=0;
- for(i=0;i<((h/6)+3);i++) /* return contents of old screen */
- { for(j=0;j<80;j++)
- { gotoxy(j,i);
- regs.h.al=chrbuf[k];
- regs.h.bl=atrbuf[k];
- regs.h.ch=0;
- regs.h.cl=1;
- regs.h.bh=0;
- regs.h.ah=9;
- int86(VIDINTR,®s,®s);
- k++;
- };
- };
- gotoxy(oldcurx,oldcury); /* return old cursor position */
- cursor(ON);
- return(NULL); /* return NULL */
- case 71: /* Home */ /* goto first filename */
- oldpos=newpos;
- newpos=0;
- hilite(oldpos,newpos);
- break;
- case 79: /* End */ /* goto last filename */
- oldpos=newpos;
- newpos=(h-1);
- hilite(oldpos,newpos);
- break;
- case 72: /* Up */ /* move up one filename */
- i=newpos;
- i-=6;
- if(i>=0)
- { oldpos=newpos;
- newpos=i;
- hilite(oldpos,newpos);
- };
- break;
- case 80: /* Down */ /* move down one filename */
- i=newpos;
- i+=6;
- if(i<h)
- { oldpos=newpos;
- newpos=i;
- hilite(oldpos,newpos);
- };
- break;
- case 75: /* Left */ /* move left one filename */
- i=newpos;
- i--;
- if(i>=0)
- { oldpos=newpos;
- newpos=i;
- hilite(oldpos,newpos);
- };
- break;
- case 77: /* Right */ /* move right one filename */
- i=newpos;
- i++;
- if(i<h)
- { oldpos=newpos;
- newpos=i;
- hilite(oldpos,newpos);
- };
- break;
- case 13: /* CR */
- k=0;
- for(i=0;i<((h/6)+3);i++) /* return contents of old screen */
- { for(j=0;j<80;j++)
- { gotoxy(j,i);
- regs.h.al=chrbuf[k];
- regs.h.bl=atrbuf[k];
- regs.h.ch=0;
- regs.h.cl=1;
- regs.h.bh=0;
- regs.h.ah=9;
- int86(VIDINTR,®s,®s);
- k++;
- };
- };
- gotoxy(oldcurx,oldcury); /* return old cursor position */
- cursor(ON);
- return(dos_dir[newpos].fname); /* return with filename */
- };
- };
- }
-
- void hilite(old,new) /* highlight a filename on the screen */
- unsigned char old,new;
- { union REGS regs;
- int oldx,oldy,newx,newy,i;
- unsigned char ccolor,locolor,hicolor;
- xyposdef xypos;
- xypos=fnamepos(old);
- oldx=xypos.x;
- oldy=xypos.y;
- xypos=fnamepos(new); /* get the position in the array of the filename */
- newx=xypos.x;
- newy=xypos.y;
- for(i=0;i<12;i++)
- { if(old<121) /* if valid position, reverse video, old selection */
- { gotoxy((oldx+i),oldy);
- regs.h.bh=0;
- regs.h.ah=8;
- int86(VIDINTR,®s,®s);
- ccolor=regs.h.ah;
- locolor=ccolor&0x0F;
- locolor<<=4;
- hicolor=ccolor&0xF0;
- hicolor>>=4;
- ccolor=locolor+hicolor;
- regs.h.ch=0;
- regs.h.cl=1;
- regs.h.bh=0;
- regs.h.bl=ccolor;
- regs.h.ah=9;
- int86(VIDINTR,®s,®s);
- };
- gotoxy((newx+i),newy); /* reverse video, new selection */
- regs.h.bh=0;
- regs.h.ah=8;
- int86(VIDINTR,®s,®s);
- ccolor=regs.h.ah;
- locolor=ccolor&0x0F;
- locolor<<=4;
- hicolor=ccolor&0xF0;
- hicolor>>=4;
- ccolor=locolor+hicolor;
- regs.h.ch=0;
- regs.h.cl=1;
- regs.h.bh=0;
- regs.h.bl=ccolor;
- regs.h.ah=9;
- int86(VIDINTR,®s,®s);
- };
- return;
- }
-
- xyposdef fnamepos(arypos) /* determine position on screen of filename[] */
- unsigned char arypos;
- { int x,y;
- xyposdef xyp;
- switch(arypos)
- { case 0: x=FPOS1; y= 1; break; /* see #define for x coordinates */
- case 1: x=FPOS2; y= 1; break;
- case 2: x=FPOS3; y= 1; break;
- case 3: x=FPOS4; y= 1; break;
- case 4: x=FPOS5; y= 1; break;
- case 5: x=FPOS6; y= 1; break;
- case 6: x=FPOS1; y= 2; break;
- case 7: x=FPOS2; y= 2; break;
- case 8: x=FPOS3; y= 2; break;
- case 9: x=FPOS4; y= 2; break;
- case 10: x=FPOS5; y= 2; break;
- case 11: x=FPOS6; y= 2; break;
- case 12: x=FPOS1; y= 3; break;
- case 13: x=FPOS2; y= 3; break;
- case 14: x=FPOS3; y= 3; break;
- case 15: x=FPOS4; y= 3; break;
- case 16: x=FPOS5; y= 3; break;
- case 17: x=FPOS6; y= 3; break;
- case 18: x=FPOS1; y= 4; break;
- case 19: x=FPOS2; y= 4; break;
- case 20: x=FPOS3; y= 4; break;
- case 21: x=FPOS4; y= 4; break;
- case 22: x=FPOS5; y= 4; break;
- case 23: x=FPOS6; y= 4; break;
- case 24: x=FPOS1; y= 5; break;
- case 25: x=FPOS2; y= 5; break;
- case 26: x=FPOS3; y= 5; break;
- case 27: x=FPOS4; y= 5; break;
- case 28: x=FPOS5; y= 5; break;
- case 29: x=FPOS6; y= 5; break;
- case 30: x=FPOS1; y= 6; break;
- case 31: x=FPOS2; y= 6; break;
- case 32: x=FPOS3; y= 6; break;
- case 33: x=FPOS4; y= 6; break;
- case 34: x=FPOS5; y= 6; break;
- case 35: x=FPOS6; y= 6; break;
- case 36: x=FPOS1; y= 7; break;
- case 37: x=FPOS2; y= 7; break;
- case 38: x=FPOS3; y= 7; break;
- case 39: x=FPOS4; y= 7; break;
- case 40: x=FPOS5; y= 7; break;
- case 41: x=FPOS6; y= 7; break;
- case 42: x=FPOS1; y= 8; break;
- case 43: x=FPOS2; y= 8; break;
- case 44: x=FPOS3; y= 8; break;
- case 45: x=FPOS4; y= 8; break;
- case 46: x=FPOS5; y= 8; break;
- case 47: x=FPOS6; y= 8; break;
- case 48: x=FPOS1; y= 9; break;
- case 49: x=FPOS2; y= 9; break;
- case 50: x=FPOS3; y= 9; break;
- case 51: x=FPOS4; y= 9; break;
- case 52: x=FPOS5; y= 9; break;
- case 53: x=FPOS6; y= 9; break;
- case 54: x=FPOS1; y=10; break;
- case 55: x=FPOS2; y=10; break;
- case 56: x=FPOS3; y=10; break;
- case 57: x=FPOS4; y=10; break;
- case 58: x=FPOS5; y=10; break;
- case 59: x=FPOS6; y=10; break;
- case 60: x=FPOS1; y=11; break;
- case 61: x=FPOS2; y=11; break;
- case 62: x=FPOS3; y=11; break;
- case 63: x=FPOS4; y=11; break;
- case 64: x=FPOS5; y=11; break;
- case 65: x=FPOS6; y=11; break;
- case 66: x=FPOS1; y=12; break;
- case 67: x=FPOS2; y=12; break;
- case 68: x=FPOS3; y=12; break;
- case 69: x=FPOS4; y=12; break;
- case 70: x=FPOS5; y=12; break;
- case 71: x=FPOS6; y=12; break;
- case 72: x=FPOS1; y=13; break;
- case 73: x=FPOS2; y=13; break;
- case 74: x=FPOS3; y=13; break;
- case 75: x=FPOS4; y=13; break;
- case 76: x=FPOS5; y=13; break;
- case 77: x=FPOS6; y=13; break;
- case 78: x=FPOS1; y=14; break;
- case 79: x=FPOS2; y=14; break;
- case 80: x=FPOS3; y=14; break;
- case 81: x=FPOS4; y=14; break;
- case 82: x=FPOS5; y=14; break;
- case 83: x=FPOS6; y=14; break;
- case 84: x=FPOS1; y=15; break;
- case 85: x=FPOS2; y=15; break;
- case 86: x=FPOS3; y=15; break;
- case 87: x=FPOS4; y=15; break;
- case 88: x=FPOS5; y=15; break;
- case 89: x=FPOS6; y=15; break;
- case 90: x=FPOS1; y=16; break;
- case 91: x=FPOS2; y=16; break;
- case 92: x=FPOS3; y=16; break;
- case 93: x=FPOS4; y=16; break;
- case 94: x=FPOS5; y=16; break;
- case 95: x=FPOS6; y=16; break;
- case 96: x=FPOS1; y=17; break;
- case 97: x=FPOS2; y=17; break;
- case 98: x=FPOS3; y=17; break;
- case 99: x=FPOS4; y=17; break;
- case 100: x=FPOS5; y=17; break;
- case 101: x=FPOS6; y=17; break;
- case 102: x=FPOS1; y=18; break;
- case 103: x=FPOS2; y=18; break;
- case 104: x=FPOS3; y=18; break;
- case 105: x=FPOS4; y=18; break;
- case 106: x=FPOS5; y=18; break;
- case 107: x=FPOS6; y=18; break;
- case 108: x=FPOS1; y=19; break;
- case 109: x=FPOS2; y=19; break;
- case 110: x=FPOS3; y=19; break;
- case 111: x=FPOS4; y=19; break;
- case 112: x=FPOS5; y=19; break;
- case 113: x=FPOS6; y=19; break;
- case 114: x=FPOS1; y=20; break;
- case 115: x=FPOS2; y=20; break;
- case 116: x=FPOS3; y=20; break;
- case 117: x=FPOS4; y=20; break;
- case 118: x=FPOS5; y=20; break;
- case 119: x=FPOS6; y=20; break;
- };
- xyp.x=x; xyp.y=y;
- return(xyp); /* return with X/Y coordinates of filename[] */
- }
-
-
- void cursor(mode) /* turn the cursor on or off */
- int mode;
- { union REGS regs;
- int i;
- if(mode==OFF)
- { regs.h.cl=7;
- regs.h.ch=32; /* set bit 5 high to turn cursor off */
- }
- else
- { int86(EQUINTR,®s,®s); /* get equipment to determine video mode */
- i=regs.h.al;
- regs.x.cx=0x0607; /* prepare for CGA */
- if((i&=0x10)!=NULL) /* if MA/MGA */
- regs.x.cx=0x0B0C; /* prepare for MA/MGA */
- };
- regs.h.ah=1;
- int86(VIDINTR,®s,®s);
- return;
- }
-
- void gotoxy(x,y) /* move cursor to a new location */
- unsigned char x,y;
- { union REGS regs;
- regs.h.bh=0;
- regs.h.dl=x;
- regs.h.dh=y;
- regs.h.ah=2;
- int86(VIDINTR,®s,®s);
- return;
- }
-
- xyposdef wherecur(void) /* report current cursor location */
- { union REGS regs;
- xyposdef xyp;
- regs.h.ah=3;
- regs.h.bh=0;
- int86(VIDINTR,®s,®s);
- xyp.y=regs.h.dh;
- xyp.x=regs.h.dl;
- return(xyp);
- }
-
- /* End Of Function dirselect() */
-